Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling
Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling
- Publicatiedatum:
- 15-07-2026
- Inwerkingtreding:
- 16-07-2026
19.3 Liquiditeit - wat is de werkkapitaalratio?
Concepten
Relaties
Eigenschappen
SPARQL query
Code gekopieerd
...Kopieer naar klembord
1# Indicator: Zorgkantoren 19.3.0 2# Parameters: ?peildatum 3# Ontologie: versie 3.0.0 of nieuwer 4 5PREFIX onz-fin: <http://purl.org/ozo/onz-fin#> 6PREFIX onz-g: <http://purl.org/ozo/onz-g#> 7PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 8 9SELECT 10 ("Werkkapitaalratio" AS ?Kental) 11 ( 12 IF( 13 BOUND(?p_totaal) && (?p_totaal != 0), 14 ROUND((xsd:decimal(?werkkapitaal_op_korte_termijn) / xsd:decimal(?p_totaal)) * 100) / 100, 15 "Ongedefinieerd" 16 ) AS ?Waarde 17 ) 18WHERE { 19 #DEEL 1: Werkkapitaal op korte termijn 20 { 21 SELECT 22 ( 23 SUM(IF(?jaarrekeningpost = "B Vlottende activa", ?Bedrag, 0)) - 24 SUM(IF(?jaarrekeningpost = "G Kortlopende schulden (ten hoogste 1 jaar)", ?Bedrag, 0)) 25 AS ?werkkapitaal_op_korte_termijn 26 ) 27 WHERE { 28 SELECT 29 ?jaarrekeningpost 30 (IF(SUM(?heeftData) > 0, SUM(?bedrag_rubriek), 0) AS ?Bedrag) 31 WHERE { 32 { # Subquery 1: Jaarrekeningposten 33 { # Middle select: Bereken het totaal per rubriek (saldo + latere mutaties) 34 SELECT 35 ?rubriek ?jaarrekeningpost_child 36 (SUM(?geld_bedrag_post) + SUM(?saldo_waarde)/COUNT(?saldo_waarde) AS ?bedrag_rubriek) 37 (IF(COUNT(?heeftBeginsaldo) + COUNT(?heeftGrootboekPost) = 0, 0, 1) AS ?heeftData) 38 WHERE { 39 { # Innermost select: 40 # - Haal het meest recente saldo per rubriek op als beginsaldo, 0 indien geen saldo in data 41 # - Haal de bijbehorende datum op om alle posten na beginsaldo bij toe te voegen 42 SELECT 43 ?rubriek ?jaarrekeningpost_child 44 (IF(BOUND(?saldo_bedrag), ?saldo_bedrag, 0) AS ?saldo_waarde) 45 ?peildatum_argument 46 (IF(BOUND(?saldo_datum), ?saldo_datum, ?unbound) AS ?begin_datum) 47 ?saldo_datum ?saldo ?heeftBeginsaldo 48 WHERE { 49 # BIND("2024-12-31"^^xsd:date AS ?peildatum) 50 BIND(?peildatum as ?peildatum_argument) 51 52 # Bind jaarrekeningpost_child(jaarrekening subpost)op basis van rubriekCode 53 # Deze code gaat ervan uit dat alle prismant codes die met cijfers beginnen en 6 cijfers hebben 54 # Er bestaan ook codes die eruit zien als onz-fin:rubriek05 55 # deze nemen we bewust niet mee (want dat zijn verzamelniveaus) 56 { 57 # Prismant: prefix-mapping, want Prismant consolideert niet dus we willen onderliggende rubrieken 58 { 59 ?rubriek a onz-fin:Grootboekrubriek . 60 } 61 UNION 62 { 63 ?rubriek a onz-fin:Grootboekrekening . 64 # in de testdata is deze branch overbodig, voor de zekerheid laten staan omdat in werkelijkheid 65 # de codes waarschijnlijk grootboekrekeningen zijn 66 } 67 BIND(STRAFTER(STR(?rubriek), STR(onz-fin:)) AS ?rubriekCode) 68 69 VALUES (?prismantPrefix ?jaarrekeningpost_child) { 70 ("3" "B.I") 71 ("12" "B.II") 72 ("131" "B.III") 73 ("132" "B.IV") 74 75 ("14" "G") 76 ("15" "G") 77 } 78 FILTER(STRSTARTS(?rubriekCode, ?prismantPrefix)) 79 } 80 UNION 81 { 82 # RGS: exacte mapping, want RGS consolideert zelf onderliggende rubrieken 83 # Dit houdt in dat rubrieken naast de directe boekingen ook de totaaltelling 84 # van alle boekingen op alle onderliggende rubrieken bevatten (algemene uitgangspunten)BELANGRIJK 85 # We willen dus niet dubbel tellen en vandaar exacte match 86 VALUES (?rubriekCode ?jaarrekeningpost_child) { 87 ("BVrd" "B.I") 88 ("BPro" "B.I") 89 ("BObd" "B.I") 90 ("BVor" "B.II") 91 ("BVfi" "B.II") 92 ("BEff" "B.III") 93 ("BLim" "B.IV") 94 95 ("BSch" "G") 96 } 97 98 BIND(IRI(CONCAT(STR(onz-fin:), ?rubriekCode)) AS ?rubriek) 99 { 100 ?rubriek a onz-fin:Grootboekrubriek . 101 } 102 UNION 103 { 104 ?rubriek a onz-fin:Grootboekrekening . 105 } 106 } 107 108 OPTIONAL { 109 ?rubriek onz-g:isAbout ?saldo . 110 ?saldo 111 a onz-fin:EindSaldo ; 112 onz-fin:heeftGeldBedrag ?saldo_bedrag ; 113 onz-g:hasDate ?saldo_datum . 114 115 FILTER (?saldo_datum <= ?peildatum_argument) 116 117 FILTER NOT EXISTS { 118 ?rubriek onz-g:isAbout ?saldo2 . 119 ?saldo2 120 a onz-fin:EindSaldo ; 121 onz-g:hasDate ?saldo_datum2 . 122 123 FILTER(?saldo2 != ?saldo) 124 FILTER(?saldo_datum2 <= ?peildatum_argument) 125 FILTER( 126 ?saldo_datum2 > ?saldo_datum || 127 ( 128 ?saldo_datum2 = ?saldo_datum 129 && STR(?saldo2) > STR(?saldo) 130 ) 131 ) 132 } 133 } 134 # Bind alleen als er een saldo in de data aanwezig was 135 BIND(IF(BOUND(?saldo_bedrag), 1, ?unbound) AS ?heeftBeginsaldo) 136 137 } 138 } # End of innermost query: Alle aanwezige beginsaldos zijn gevonden 139 140 # Selecteer de bijbehorende grootboekpost bij de rubriek 141 OPTIONAL { 142 ?grootboek_post 143 a onz-fin:Grootboekpost ; 144 onz-g:partOf ?rubriek ; 145 onz-g:hasDate ?datum ; 146 onz-fin:heeftGeldBedrag ?geld_bedrag_temp . 147 # Behoud de grootboek post alleen voor de meest specifieke rubriek, 148 # om dubbeltelling bij meerdere rubrieken te voorkomen 149 FILTER NOT EXISTS { 150 ?grootboek_post onz-g:partOf ?specifiekereRubriek . 151 ?specifiekereRubriek onz-g:partOf+ ?rubriek . 152 } 153 FILTER (?datum <= ?peildatum_argument && (?datum > ?begin_datum || !BOUND(?begin_datum))) 154 BIND (1 AS ?heeftGrootboekPost) 155 } 156 BIND(IF(BOUND(?geld_bedrag_temp), ?geld_bedrag_temp, 0) AS ?geld_bedrag_post) 157 158 } GROUP BY ?rubriek ?jaarrekeningpost_child 159 } # End of middle query: Alle beginsaldos + transacties daarna zijn gevonden (eindtotaal bekend) 160 161 # De rest van subquery 1 breidt de jaarrekeningposten uit met hun bijbehorende totaal posten 162 VALUES (?jaarrekeningpost_child ?jaarrekeningpost_child_uitgebreid) { 163 ("B.I" "B.I Voorraden") 164 ("B.II" "B.II Vorderingen") 165 ("B.III" "B.III Effecten") 166 ("B.IV" "B.IV Liquide middelen") 167 168 ("G" "G Kortlopende schulden (ten hoogste 1 jaar)") 169 } 170 171 BIND( 172 IF(STRSTARTS(?jaarrekeningpost_child, "B."), "B Vlottende activa", 173 ?unbound) AS ?jaarrekeningpost_parent # Fallback naar ?unbound om dubbeltelling te voorkomen 174 ) 175 176 VALUES ?x {1 2 3} 177 BIND( 178 IF(?x = 1, ?jaarrekeningpost_child_uitgebreid, 179 IF(?x = 2, ?jaarrekeningpost_parent, 180 IF(?x = 3, ?jaarrekeningpost_grandparent, 181 ?unbound))) AS ?jaarrekeningpost 182 ) 183 184 FILTER(BOUND(?jaarrekeningpost)) 185 186 } # End of subquery 1: Alle totalen voor de aanwezige jaarrekeningposten zijn bepaald (inclusief de overkoepelende jaarrekeningposten) 187 UNION 188 { # Subquery 2: Initieer alle jaarrekeningposten met bedrag=0 189 190 VALUES ?jaarrekeningpost { 191 "B.I Voorraden" 192 "B.II Vorderingen" 193 "B.III Effecten" 194 "B.IV Liquide middelen" 195 "B Vlottende activa" 196 197 "G Kortlopende schulden (ten hoogste 1 jaar)" 198 } 199 200 BIND(0 AS ?bedrag_rubriek) 201 BIND(0 AS ?heeftData) # Tijdens initieren is het nog onduidelijk of er data voor de rubriek aanwezig is 202 } 203 204 } GROUP BY ?jaarrekeningpost 205 ORDER BY ?jaarrekeningpost 206 } 207 } 208 209 # DEEL 2: P totaal berekenen 210 { 211 SELECT 212 (SUM(?p_bedrag) AS ?p_totaal) 213 WHERE { 214 #BIND("2024-12-31"^^xsd:date AS ?peildatum) 215 BIND( 216 IF( 217 MONTH(?peildatum) = 12 && DAY(?peildatum) = 31, 218 xsd:date(CONCAT(STR(YEAR(?peildatum)), "-01-01")), 219 xsd:date(CONCAT(STR(YEAR(?peildatum)-1), "-07-01")) 220 ) 221 AS ?startperiode) 222 BIND(?peildatum AS ?eindperiode) 223 224 # Koppel grootboekposten aan rubrieken binnen meetperiode 225 ?grootboek_post 226 a onz-fin:Grootboekpost ; 227 onz-g:partOf ?rubriek ; 228 onz-g:hasDate ?datum ; 229 onz-fin:heeftGeldBedrag ?geld_bedrag . 230 231 # Match directe ouder: Grootboekrekening (RGS) of Grootboekrubriek (Prismant) 232 { 233 { ?rubriek a onz-fin:Grootboekrekening } 234 UNION 235 { ?rubriek a onz-fin:Grootboekrubriek } 236 } 237 # Anti-dubbeltelling: houd alleen het bladniveau (geen transitive ancestors) 238 FILTER NOT EXISTS 239 { 240 ?grootboek_post onz-g:partOf ?specifiekereRubriek . 241 ?specifiekereRubriek onz-g:partOf+ ?rubriek . 242 } 243 FILTER(STRSTARTS(STR(?rubriek), STR(onz-fin:))) 244 BIND(STRAFTER(STR(?rubriek), STR(onz-fin:)) AS ?rubriekCode) 245 246 FILTER (?datum >= ?startperiode && ?datum <= ?eindperiode) 247 248 # P-bedragen 249 BIND( 250 IF( 251 STRSTARTS(?rubriekCode, "81") || 252 STRSTARTS(?rubriekCode, "82") || 253 STRSTARTS(?rubriekCode, "83") || 254 STRSTARTS(?rubriekCode, "89") || 255 STRSTARTS(?rubriekCode, "919") || 256 STRSTARTS(?rubriekCode, "920") || 257 STRSTARTS(?rubriekCode, "930") || 258 STRSTARTS(?rubriekCode, "WOmz") || 259 STRSTARTS(?rubriekCode, "WRev") || 260 STRSTARTS(?rubriekCode, "WRvi") || 261 STRSTARTS(?rubriekCode, "WRgr") || 262 STRSTARTS(?rubriekCode, "WWvv") || 263 STRSTARTS(?rubriekCode, "WNoa") || 264 STRSTARTS(?rubriekCode, "WLbe") || 265 STRSTARTS(?rubriekCode, "WBat") || 266 STRSTARTS(?rubriekCode, "WWiv") || 267 STRSTARTS(?rubriekCode, "WOvb"), 268 ?geld_bedrag, 0) AS ?p_bedrag 269 ) 270 } 271 } 272} 273ORDER BY ?Kental 274